package modelo.tanque;


import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.Enumeration;
import java.util.Hashtable;

import Controlador.EscuchadorKeyPress;
import ar.uba.fi.algo3.titiritero.ControladorJuego;

import vista.tanque.VistaAlgoTank;

import modelo.Contenedor;
import modelo.Posicion;
import modelo.Vector;
import modelo.metodoDeDisparo.Ametralladora;
import modelo.metodoDeDisparo.Canion;
import modelo.metodoDeDisparo.LanzaCohete;
import modelo.metodoDeDisparo.MetodoDeDisparo;
import modelo.proyectil.Proyectil;

public class AlgoTank extends Tanque{
	private MetodoDeDisparo armamento;
	private static int MAX_COHETES = 10;
	private static int MAX_CANIONES = 15;
	private int vidas;
	private int puntos;
	
	public AlgoTank(Posicion p){
		super(p);
		vidas = 3;
		velocidadmov=5;
		velocidaddis = 0.3;
		armamento = new Ametralladora();
		setDireccion(new Vector (0,0));
	}

	public void cambiarArmamento(MetodoDeDisparo metodo){
		armamento = metodo; 
	}
	

	public void mover(){
		posicion.cambiarPosicion(velocidadmov, this.getDireccion(), ancho, alto);
		
		
	}

	public int getMaxCaniones(){
		return MAX_CANIONES;
	}
	
	public int getMaxCohetes(){
		return MAX_COHETES;
	}


		
	public Proyectil disparar(){
		Posicion pos = calcularPosicionProyectil(posicion);
		int dirX = direccion.getX();
		int dirY = direccion.getY();
		Proyectil p = armamento.disparar(pos,new Vector(dirX,dirY));
		Contenedor.getInstance().agegarNuevoColisionable(p);
		return p;
	}
	
	public void vivir() {
		mover();
		chequearVida();
		
	}

	@Override
	public void agregarseAListas() {
		ControladorJuego unControlador = Contenedor.getInstance().getControlador();
		VistaAlgoTank vistaAlgoTank = new VistaAlgoTank();
		vistaAlgoTank.setPosicionable(this);
		unControlador.agregarDibujable(vistaAlgoTank);
		unControlador.agregarObjetoVivo(this);
		Contenedor.getInstance().setAlgoTank(this);	
	}
	
	//Se suman puntos por destruir tanques, incluso si fueron destruidos por fuego amigo
	public void aumentarPuntos(int puntosASumar){
		puntos = puntos + puntosASumar;
		Contenedor.getInstance().restarTEnemigos();
		if(puntos >= 1000 + 1000*Contenedor.getInstance().getNivel()){
			Contenedor.getInstance().reiniciarTEnemigos();
			Contenedor.getInstance().nivelSiguiente();
		}
	}

	public void chequearVida() {
		if (this.getResistencia()<=0){
			vidas--;
			//PAra que aparezca junto al cuartel o algo...
			Posicion p = new Posicion(240,30);
			//la direccion inicial vuelve a ser (0,0)
			Vector dir = new Vector(0,0);
			setDireccion(dir);
			//al ser una nueva vida, la resistencia vuelve otra vez a 100
			aumentarResistencia(100);
			setPosicion(p);
		}
		if(vidas==0){
			Contenedor.getInstance().setGameOver();
		}
		
	}

	public int getPuntos() {
		return puntos;
	}
	
	public String guardarSe(){
		String salida = "<Objeto Tipo=\"";
		salida += "AlgoTank";
		salida += "\" PosX=\"";
		salida += this.posicion.getX();
		salida += "\" PosY=\"";
		salida += this.posicion.getY();
		salida += "\" DireccionX=\"";
		salida += this.direccion.getX();
		salida += "\" DireccionY=\"";
		salida += this.direccion.getY();
		salida += "\" CantidadDisparo=\"";
		salida += this.armamento.getCantidadDisparo();
		salida += "\" Armamento=\"";
		salida += this.armamento.getNombre();
		salida += "\" Vidas=\"";
		salida += this.vidas;
		salida += "\" Puntos=\"";
		salida += this.puntos;
		salida += "\" Resistencia=\"";
		salida += this.resistencia;
		salida += "\" VelocidadDis=\"";
		salida += this.velocidaddis;
		salida += "\" VelocidadMov=\"";
		salida += this.velocidadmov;
		salida += "\" />\r";
		return salida;
	}

	public static void leer(Enumeration e, Hashtable h) {
		String key;
		String val;
		int cantidadDisparo = 1;
		AlgoTank unAlgoTank = new AlgoTank(new Posicion(0, 0));
		while (e.hasMoreElements()) {
			key = (String) e.nextElement();
			val = (String) h.get(key);
			if (key.equalsIgnoreCase("PosX")) {
				int posY = unAlgoTank.getPosicion().getY();
				unAlgoTank.setPosicion(new Posicion(Integer.parseInt(val), posY));
			} else if (key.equalsIgnoreCase("PosY")) {
				int posX = unAlgoTank.getPosicion().getX();
				unAlgoTank.setPosicion(new Posicion(posX, Integer.parseInt(val)));
			} else if (key.equalsIgnoreCase("DireccionX")) {
				int dirY = unAlgoTank.getDireccion().getY();
				unAlgoTank.setDireccion(new Vector(Integer.parseInt(val), dirY));
			} else if (key.equalsIgnoreCase("DireccionY")) {
				int dirX = unAlgoTank.getDireccion().getX();
				unAlgoTank.setDireccion(new Vector(dirX, Integer.parseInt(val)));
			} else if (key.equalsIgnoreCase("CantidadDisparo")) {
				cantidadDisparo = Integer.parseInt(val);
			} else if (key.equalsIgnoreCase("Armamento")) {
				if(val.equalsIgnoreCase("Ametralladora")){
					unAlgoTank.cambiarArmamento(new Ametralladora());
				} else if(val.equalsIgnoreCase("Canion")){
					unAlgoTank.cambiarArmamento(new Canion(cantidadDisparo));
				} else if(val.equalsIgnoreCase("LanzaCohete")){
					unAlgoTank.cambiarArmamento(new LanzaCohete(cantidadDisparo));
				}
			} else if (key.equalsIgnoreCase("Vidas")) {
				unAlgoTank.setVidas(Integer.parseInt(val));
			} else if (key.equalsIgnoreCase("Puntos")) {
				unAlgoTank.setPuntos(Integer.parseInt(val));
			} else if (key.equalsIgnoreCase("Resistencia")) {
				unAlgoTank.setResistencia(Float.parseFloat(val));
			} else if (key.equalsIgnoreCase("VelocidadDis")) {
				unAlgoTank.setVelocidadDisparo(Float.parseFloat(val));
			} else if (key.equalsIgnoreCase("VelocidadMov")) {
				unAlgoTank.setVelocidad(Integer.parseInt(val));
			}
		}
		
		VistaAlgoTank vistaAlgoTank = new VistaAlgoTank();
		vistaAlgoTank.setPosicionable(unAlgoTank);
		ControladorJuego unControlador = Contenedor.getInstance().getControlador();
		unControlador.agregarDibujable(vistaAlgoTank);
		unControlador.agregarObjetoVivo(unAlgoTank);
		Contenedor.getInstance().setAlgoTank(unAlgoTank);
		unControlador.agregarKeyPressObservador(new EscuchadorKeyPress(unAlgoTank));
	}

	private void setVelocidadDisparo(float velocidad) {
		this.velocidaddis = velocidad;
	}

	private void setResistencia(float f) {
		this.resistencia = f;
	}

	private void setPuntos(int puntos) {
		this.puntos = puntos;
	}

	private void setVidas(int vidas) {
		this.vidas = vidas;
	}
}

